class Controller{
  constructor(ctx, next) {
    this.ctx = ctx;
    this.next = next;
    this._view = null;
    this._init();
  }

  _init() {}

  /**
   * 直接内容输出
   * @param {String} content 需要输出的内容
   */
  async display(content) {
    await this.view.display(content);
  }

  /**
   * 直接文件输出
   * @param {String} template 文件路径地址
   * @param {Boolean} html 是否返回文件内容，true返回内容，false直接输出到页面
   */
  async load(template, html=false) {
    return await this.view.load(template, html);
  }

  /**
   * 直接渲染内容输出
   * @param {String} content 要渲染的内容
   * @param {Boolean} html 是否返回渲染内容，true返回内容，false直接输出到页面
   */
  async render(content, html=false) {
    return await this.view.render(content, html);
  }

  /**
   * 渲染模板
   * @param {String} template 要渲染的模板文件
   * @param {Object} data 渲染的数据对象
   * @param {Boolean} html 是否返回模板文件渲染内容，true返回内容，false直接输出到页面
   */
  async fetch(template, data, html=false) {
    return await this.view.fetch(template, data, html);
  }

  /**
   * 赋值模板变量
   * @param {String} name 模板变量名
   * @param {Any} value 模板变量的值
   */
  assign(name, value) {
    this.view.assign(name, value);
  }

  /**
   * 获取模板数据
   * @param {String} name 模板变量名
   */
  data(name) {
    return this.view.data(name);
  }

  get view() {
    if(!this._view) this._view = new (require('./view'))(this.ctx, this.next);
    return this._view;
  }

}

module.exports = Controller;